<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"/>
<title>Ioc - 复合加载器</title><link href="../zdoc.css" rel="stylesheet" type="text/css"/><link href="../_rs/site.css" rel="stylesheet" type="text/css"/><script src="../_rs/jquery.js" language="Javascript"></script><script src="../_rs/site.js" language="Javascript"></script><script src="../_rs/z.js" language="Javascript"></script>
</head>
<body><a name="top"></a>
<div class="zdoc_header">Ioc - 复合加载器</div>
<div class="zdoc_author"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
<div class="zdoc_body">
<ul class="zdoc_index_table">
<li>
<div><span class="num">1</span><a href="#为什么需要复合加载器">为什么需要复合加载器</a></div>
</li>
<li>
<div><span class="num">2</span><a href="#复合加载器的使用方法">复合加载器的使用方法</a></div>
</li>
<li>
<div><span class="num">3</span><a href="#在_Mvc_中的用法">在 Mvc 中的用法</a></div>
</li>
<li>
<div><span class="num">4</span><a href="#现在你都可以复合什么?">现在你都可以复合什么?</a></div>
</li>
</ul>
<div class="hr"><b></b></div>
<h1><a name="为什么需要复合加载器"></a>为什么需要复合加载器</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>Ioc 实际上一种将应用的耦合集中在一起管理的一种程序结构设计方式。耦合集中的具体形式一般是各种格式的配置文件。比如 Spring 就有它自己的配置文件格式的规定。</p>
<p>Nutz.Ioc 在设计之初就没有特别假定用户会把配置文件存成某种特定的格式，关于这点，各位可以参看 <a href="ioc_loader.html">定义自己的配置文件格式</a> 一文。</p>
<p>同时，我们发现，在实际应用的时候，应用程序的耦合大概分做两种：</p>
<ol type="1">
<li>千秋万载，基本不变</li>
<li>部署之时，可能改变</li>
</ol>
<p>第一种耦合关系，其实更适合写成 Annotation，这样程序发布之后就不必担心人为的错误修改了。而第二种则更适合写在配置文件里，你们的部署工程师可以看着你提供的小文档，根据客户现场的情况调整你的应用的各种参数。</p>
<p>如果将这两种耦合关系都写在配置文件里，首先部署工程师会看到一大堆你都可能忘记是什么意思的配置信息，当这些符号映入眼帘之时，<b>恐惧</b>会瞬间将TA吞没，嚼的骨头都不剩。是的，这就是面对陌生的事物，正常人类很正常的一种反应，怪不得他不是吗？</p>
<p>或者可怜的部署工程师手里拿的是你几个星期吐血写出来的长长的系统参数手册，那么写这个手册之前，感到恐怖的可能就是你了，我亲爱的同学。之后，他在鼓起勇气阅读的之前，通常也会倒吸一口凉气。</p>
<p>当然，人的智慧就是在这过程中得到了淬炼，你的意志力，你的智慧，都会得到不同程度的升华。但是 Nutz 这个小框架开发的初衷并不是希望锻炼你，折磨你，事实上，它希望尽一切可能，让你远离这种锻炼...</p>
<p>...为此，我们也提供一个复合加载器，你可以将你的耦合关系写在配置文件中，或者Annotation中，怎样分配则由亲爱的程序员同学你来亲自决定。</p>
<div class="hr"><b></b></div>
<h1><a name="复合加载器的使用方法"></a>复合加载器的使用方法</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>复合加载器非常简单，似乎只花了 Wendal 同学不到 1 个小时的时间，因为它本身并不做任何事情，它只是调用其他的加载器：</p>
<pre>Ioc ioc = new NutIoc(new ComboIocLoader(
                 "*org.nutz.ioc.loader.json.JsonLoader",
                 "dao.js", 
                 "service.js", 
                 "*org.nutz.ioc.loader.annotation.AnnotationIocLoader", 
                 "com.myapp.module",
                 "com.myapp.service"
		 )); 
</pre>
<p>如上面的例子，组合加载器，组合了两个 Ioc 加载器，一个是 JsonLoader，一个是AnnotationIocLoader。 </p>
<p>ComboIocLoader 的构造函数是个字符串形变参数组，所有的参数，如果以星号 "<span style="color:#0000AA;"><b> *</b></span>" 开头，则被认为是加载器的类型，后面的参数都作为这个加载器构造函数的参数，直到遇到下一个星号 "<span style="color:#0000AA;"><b> *</b></span>" 开头的参数。</p>
<p>上面的例子，实际上为 Ioc 容器准备了这两个加载器，第一个是 JSON 加载器，它从 dao.js 和service.js 这两个配置文件中读取容器对象的配置信息。 而另外一个 Annotation 加载器，从会扫描包 <b>com.myapp.module</b> 以及 <b>com.myapp.service</b> 已经其下的子包，如果发现有容器对象（声明了 @IocBean 注解，详情请看 <a href="loader_annotation.html">Ioc - Annotation 加载器</a>）就会加载。</p>
<p>并且这两个加载器的优先级为</p>
<p><span style="color:#008800;"><b>排在前面前面的加载器更优先</b></span>， </p>
<p>在本节的例子中， JsonLoader 加载器比 AnnotationIocLoader 更加优先.就是说，如果两个加载器都加载了同名对象，则以 JsonLoader 的为准</p>
<div class="hr"><b></b></div>
<h1><a name="在_Mvc_中的用法"></a>在 Mvc 中的用法</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>在 Nutz.Mvc 中，Ioc 容器是由 IocProvider 接口来提供的，所以，每个加载器都由一个类似的 IocProvier 实现。比如 ComboIocLoader，也就有一个 ComboIocProvider。</p>
<p><span style="color:#FF0000;"><b>但是，请千万要注意:</b></span> 对于 ComboIocProvider:</p>
<p><span style="color:#0000FF;"><b>它组合的依然是其他 IocLoader</b></span></p>
<p>而不是</p>
<p><span style="color:#008800;"><i>其他 IocProvider</i></span></p>
<p>下面给个例子：</p>
<pre>@IocBy(type = ComboIocProvider.class,
       args = {"*org.nutz.ioc.loader.json.JsonLoader",
               "dao.js", 
               "service.js", 
               "*org.nutz.ioc.loader.annotation.AnnotationIocLoader", 
               "com.myapp.module",
               "com.myapp.service"
		})
public class MainModule {
	...
</pre>
<p>它是什么意思呢？ 不解释，你懂的。</p>
<div class="hr"><b></b></div>
<h1><a name="现在你都可以复合什么?"></a>现在你都可以复合什么?</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p></p>
<ul type="disc">
<li>XmlIocLoader</li>
<li>JsonLoader</li>
<li>AnnotationIocLoader</li>
<li>MapLoader</li>
<li>其他任何你自己实现的 IocLoader</li>
</ul>
</div>
<div class="zdoc_footer"><em>By:</em><b>zozoh</b><a href="mailto:zozohtnt@gmail.com">&lt;zozohtnt@gmail.com&gt;</a></div>
</body>
</html>